版本情況
C# 11(回顧):required 成員、原始字串(raw string)、list patterns…(本文聚焦兩項)
C# 12:主建構式、集合運算式、lambda 預設參數、using 可別名任意型別
C# 13(.NET 9):params 可用集合運算式、ref readonly 參數 等
提示:若使用預覽功能,於 .csproj 設定 preview
required 成員(C# 11)
public class User
{
        public required int Id { get; init; }
        public required string Name { get; init; }
}
var u = new User { Id = 1, Name = "Alice" }; // OK
// var bad = new User { Id = 1 };            // 編譯錯誤:Name 未指定
原始字串 Raw string(C# 11)
var json = """
{
    "id": 1,
    "name": "Alice\nBob"
}
""";
var name = "Alice";
var s = $"""
Hello, {name}
Path: C:\temp\file.txt
""";
var col = "color";
var css = $$"""
.btn { {{col}}: red; }  // 使用 $$ 與 {{ }} 插入大括號
""";
主建構式 Primary constructors(C# 12)
public class Person(string name, int age)
{
        public string Name { get; } = name;
        public int Age { get; } = age;
}
集合運算式 Collection expressions(C# 12)
int[] a = [1, 2, 3];
List<int> b = [..a, 4, 5];
ReadOnlySpan<int> s = [10, 20];
Lambda 預設參數(C# 12)
var f = (int x = 42) => x * 2;
var r1 = f();    // 84
var r2 = f(5);   // 10
using 可別名任意型別(C# 12)
using Pair = (int X, int Y);
Pair p = (1, 2);
params 搭配集合運算式(C# 13)
void Print(params int[] xs) { /* ... */ }
Print([1, 2, 3]);          // 直接使用集合運算式
Print([..Enumerable.Range(1, 3)]);
ref readonly 參數(C# 13)
static int Len(ref readonly ReadOnlySpan<char> s) => s.Length;
var name = "Alice";
var span = name.AsSpan();
var n = Len(in span); // 呼叫端以 in 傳入
```## C# 12/13 新語言特性  
<LangVersion>preview</LangVersion>
public class User  
{  
    public required int Id { get; init; }  
    public required string Name { get; init; }  
}  
var u = new User { Id = 1, Name = "Alice" }; // 成功  
// var bad = new User { Id = 1 };            // 編譯錯誤:Name 未指定  
[SetsRequiredMembers]
$ 支援插值var json = """  
{  
    "id": 1,  
    "name": "Alice\nBob"  
}  
""";  
var name = "Alice";  
var s = $"""  
Hello, {name}  
Path: C:\temp\file.txt  
""";  
var col = "color";  
var css = $$"""  
.btn { {{col}}: red; }  
""";  
public class Person(string name, int age)  
{  
    public string Name { get; } = name;  
    public int Age { get; } = age;  
}  
[] 建立或合併集合,支援展開(..)與多型轉換int[] a = [1, 2, 3];  
List<int> b = [..a, 4, 5];  
ReadOnlySpan<int> s = [10, 20];  
var f = (int x = 42) => x * 2;  
var r1 = f();    // 84  
var r2 = f(5);   // 10  
using Pair = (int X, int Y);  
Pair p = (1, 2);  
void Print(params int[] xs) { /* ... */ }  
Print([1, 2, 3]);  
Print([..Enumerable.Range(1, 3)]);  
static int Len(ref readonly ReadOnlySpan<char> s) => s.Length;  
var name = "Alice";  
var span = name.AsSpan();  
var n = Len(in span);  
簡單小結
C# 12與13持續強化開發效率與程式碼清晰度。必要成員有效避免未初始化錯誤,確保物件狀態完整性;原始字串大幅簡化多行字串處理,尤其適用JSON或SQL內嵌場景。主建構式減少類別宣告樣板程式碼,集合運算式提供直觀的集合操作方式,支援展開與型別轉換。Lambda預設參數提升匿名函式彈性,using別名擴展至複雜型別。C# 13新增的params集合運算式整合與ref readonly參數,進一步優化參數傳遞語義。這些特性共同提升可讀性與維護性,建議在新專案中優先採用必要成員與原始字串,逐步引入其他功能。使用預覽功能時需明確設定語言版本,並注意相容性。整體而言,新特性聚焦開發者體驗,降低常見錯誤風險,同時保持語言輕量與高效。